In diesem Kapitel schauen wir uns das Session-Handling und die Weiterleitung in PHP an. In PHP können Sessions mit dem Funktionsaufruf session\_start gestartet werden. Der Server erzeugt dabei eine ID, die als eindeutiger Schlüssel dient. Der Browser des Clients speichert diese Session-ID in der Regel als Cookie ab. Bei jeder weiteren Anfrage an den gleichen Webserver wird diese Session-ID mitgesendet. Damit kann der Webserver den Client wiedererkennen. Mit dem Angriff des Session-Hijackings kann man die Session von einem bereits eingeloggten Benutzer übernehmen und in seinem Namen weiterarbeiten. Abhängig von den Browsereinstellungen nutzt der Browser diese Session-ID auch bei Anfragen über einen neuen Tab. Der Webserver erzeugt im Verzeichnis /var/lib/php/sessions für jede neue Session eine neue Datei. Der Speicherort kann je nach verwendetem Webserver unterschiedlich sein. Die Dateinamen entsprechen der Session-ID, allerdings mit vorangestelltem "sess\_". Alle Variablen, die innerhalb der Session verwendet werden, werden in dieser Datei gespeichert: also die Variablen prof, vorlesung und year. Alle Session-Variablen werden im Klartext in dieser Datei gespeichert. Sensible Daten sollten also niemals in der Session gespeichert werden, da bei fehlerhaft konfigurierten Webservern womöglich auf das Dateisystem zugegriffen werden kann. Ich weiß nicht, ob PHP dies in den neueren Versionen geändert hat. Finden Sie es heraus. Analog zu den POST beziehungsweise GET Arrays gibt es ein SESSION-Array. Darin können beliebig Daten gespeichert werden. Um auf dieses Array zugreifen zu können, muss davor zwingend session\_start aufgerufen werden. Damit ist es möglich, seitenübergreifend auf Informationen eines Clients zugreifen zu können. Beispielsweise wird auf einer Seite das Alter des Clients abgefragt und anschließend in dem SESSION-Array gespeichert. Nun kann auf jeder anderen Seite problemlos auf das Alter des Clients zugegriffen werden, indem die Information aus dem SESSION-Array geholt wird. Dieser Code demonstriert als Einführungsbeispiel die Funktionsweise einer Session. Die Session wird gestartet, die ID-Vergabe und der Cookie zum Client läuft voll automatisiert. Dann werden drei Variablen in das assoziative Session-Array geschrieben. Abschließend wird die ID ausgegeben. Laden Sie die Seite anschließend neu. Löschen Sie danach Ihre Cookies und laden Sie die Seite erneut. Kommen wir nun zu Weiterleitungen mit PHP. Weiterleitung in PHP funktioniert grundsätzlich über den HTTP-Header und den header-String „Location“. Wenn Sie bereits HTML-Code an den Client gesendet haben, beispielsweise nur „“, dann können Sie den HTTP-Header nicht mehr modifizieren, da er bereits zum Client gesendet wurde! Alle Prüfungen müssen also erfolgen, bevor die erste Ausgabe an den Client erfolgt. HTTP ist zustandslos. Will man also geschützte Bereiche auf der Webseite haben, muss bei jeder einzelnen Seite geprüft werden, ob der Besucher auch autorisiert ist, auf diesen Bereich zuzugreifen. Bisher werten wir aus einer vorherigen Lerneinheit nur ein HTML-Formular aus und protokollieren alle Anfragen auf das Auswertungsskript. Um ein vollständiges Login-Skript zu realisieren, muss bei korrekten Eingabedaten eine Session mit allen relevanten Informationen gestartet werden. Anschließend muss bei jeder zu schützenden Seite geprüft werden, ob der Anfragesteller auch die Berechtigung für den Zugriff hat. Falls nicht, soll der Client zum Login geleitet werden. Ansonsten soll die normale Seite angezeigt werden. Weiterhin muss es eine Möglichkeit geben, dass der Client die Session beenden kann. Die Datei auswertung.php kann nun angepasst werden. Zuerst wird geprüft, ob der Benutzername und das Passwort mit den vorgegebenen Werten übereinstimmen. Der Benutzername muss „Mustermann“ und das Passwort muss „web-hs-ma“ sein. Falls diese Daten nicht stimmen, wird die Ausführung des Skripts sofort mit einer Fehlermeldung beendet, die besagt: „Benutzername oder Passwort ist nicht korrekt!“. Falls die eingegebenen Daten korrekt sind, startet die Session mit session\_start. Der Benutzername wird dann in der Session unter dem Schlüssel „user“ gespeichert, und eine weitere Session-Variable namens „auth“ wird auf den Wert 1 gesetzt, um zu signalisieren, dass der Benutzer authentifiziert ist. Schließlich wird der Benutzer zu einer Seite namens „secure.php“ weitergeleitet, und die Ausführung des Skripts wird mit exit beendet. Die Datei secure.php wird neu wie folgt erstellt: Zunächst wird die Sitzung gestartet, indem session\_start aufgerufen wird. Anschließend erfolgt eine Überprüfung, ob der Nutzer berechtigt ist, auf die Seite zuzugreifen. Dies wird durch eine Bedingung realisiert, die prüft, ob die Session-Variable „user“ gesetzt ist und ob die Session-Variable „auth“ den Wert 1 hat. Falls diese Bedingungen nicht erfüllt sind, wird der Nutzer auf eine Seite namens „formular.html“ weitergeleitet. Die Ausführung des Skripts wird dann sofort mit exit beendet. Nach der erneuten Zugangsprüfung kann der Inhalt nun angezeigt werden. Hier ist ein HTML-Code, der den Namen des Benutzers aus der Session verwendet. Die Zugangsprüfung muss vor jeder einzelnen geschützten Seite erfolgen! Die Datei logout.php kann nun auch erstellt werden: Sie entfernt die Session-Daten vom Server und löscht die Session-ID. Damit sind alle grundlegenden Funktionen eines Login-Systems implementiert. Nutzen Sie dieses System NICHT für reale Projekte: Das ist nur eine erste Skizze zum Verstehen! Zum Abschluss sehen Sie nochmal alle wichtigen Session-Funktionen von PHP in einer Tabelle.